package org.wdcode.core.json;

import java.util.List;
import java.util.Map;

import net.sf.json.JSONArray;
import net.sf.json.JSONException;
import net.sf.json.JSONObject;
import net.sf.json.util.JSONTokener;

import org.wdcode.common.exception.CustomRuntimeException;
import org.wdcode.common.tools.Lists;
import org.wdcode.common.tools.Maps;

/**
 * Json格式读写器
 * @author WD
 * @since JDK6
 * @version 1.0 2009-03-28
 */
final class JsonImpl implements Json {
	// JSONObject
	private JSONObject	json;

	/**
	 * 构造参数
	 * @param s
	 */
	public JsonImpl(String s) {
		try {
			// 生成JSONObject
			json = (JSONObject) new JSONTokener(s).nextValue();
		} catch (JSONException e) {
			throw new CustomRuntimeException(e);
		}
	}

	/**
	 * 设置一个JsonObject
	 * @param key JsonObject名
	 */
	public final void setJsonObject(String key) {
		try {
			// 获得新的JsonObject
			json = json.getJSONObject(key);
		} catch (JSONException e) {
			throw new CustomRuntimeException(e);
		}
	}

	/**
	 * 获得key下的所有属性
	 * @param key 属性key
	 * @return List包含属性名和值
	 */
	public final List<Map<String, String>> getArray(String key) {
		return getArray(json, key);
	}

	/**
	 * 根据name获得所有属性
	 * @param name JsonObject Name
	 * @param key 属性key
	 * @return List包含属性名和值
	 */
	public final List<Map<String, String>> getArray(String name, String key) {
		try {
			return getArray(json.getJSONObject(name), key);
		} catch (JSONException e) {
			throw new CustomRuntimeException(e);
		}
	}

	/**
	 * 读取属性
	 * @param json
	 * @param key
	 * @return
	 */
	private List<Map<String, String>> getArray(JSONObject json, String key) {
		try {
			// 获得属性
			JSONArray array = json.getJSONArray(key);
			// 总数量
			int size = array.size();
			// 获得List实例
			List<Map<String, String>> list = Lists.getList(size);
			// 声明Map
			Map<String, String> map = null;
			// 循环属性
			for (int i = 0; i < size; i++) {
				// 获得JSONObject
				JSONObject jo = array.getJSONObject(i);
				// 获得Map实例
				map = Maps.getMap(jo.size());
				// 把数据写到Map中
				jo.accumulateAll(map);
				// 把Map添加到列表中
				list.add(map);
			}
			// 返回列表
			return list;
		} catch (JSONException e) {
			throw new CustomRuntimeException(e);
		}
	}

	/**
	 * 关闭资源方法
	 */
	public void close() {
		json.clear();
		json = null;
	}
}